﻿Namespace SchoolClick.Controllers
    Public Class RegistroAcademicoController
        Inherits AuthorizeBaseController

#Region "METODOS PARA EL MENU ""NUEVO INGRESO"""
        <Authorize(Roles:="ERA")> _
        <ConstructSubMenu()> _
        Function Index() As ActionResult
            Dim a = RouteData.Values("topmenu")
            Return View()
        End Function

        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function Nuevo_Ingreso() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _getInfoPeriodoNuevoIngreso(year As Integer) As ActionResult
            Dim db As New SchoolClickDAL
            ViewBag.Year = year

            'Comprobamos si el periodo existe en el sistema
            If db.IMatricula.IsExistYearMatricula(year) Then
                Dim infoPNI = db.IMatricula.GetInfoPeriodoMatricula(year)
                Return PartialView(New InfoPeriodoNuevoIngreso With {
                                        .FECHA_INICIO = infoPNI.FECHA_INI,
                                        .FECHA_FINALIZACION = infoPNI.FECHA_FIN,
                                        .HORA_INICIO = infoPNI.FECHA_INI,
                                        .HORA_FINALIZACION = infoPNI.FECHA_FIN,
                                        .SHOW_LIST_PRESELECCION = infoPNI.SHOW_PRESELECCION,
                                        .SHOW_LIST_SELECCIONADOS = infoPNI.SHOW_QUEDARON
                                   })
            End If

            Return PartialView("_NotFound_InfoPeriodoNuevoIngreso")
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _getResumenSolicitudNuevoIngreso(year As Integer) As ActionResult
            Dim db As New SchoolClickDAL
            ViewBag.Year = year
            ViewBag.TotalSolicitudes = db.IMatricula.GetResumenSolicitudesRecibidas(year).Sum(Function(s) s.TOTAL).Value
            Return PartialView(db.IMatricula.GetResumenSolicitudesRecibidas(year))
        End Function

        <HttpPost()> _
        <JFValidarModel()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _Save_Info_Periodo_NuevoIngreso(year As String, model As InfoPeriodoNuevoIngreso) As JsonResult
            Dim db As New SchoolClickDAL
            db.IMatricula.UpdateInfoPeriodoNuevoIngreso(year.EncodeHTML, model)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("Se actualizaron correctamente los datos del periodo de nuevo ingreso en el sistema.",
                                                                       titulo:="¡Actualización correcta!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.Update,
                                                                       tiempo:=7000)})
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _getGradosNuevoIngreso(year As Integer) As ActionResult
            Dim db As New SchoolClickDAL
            ViewBag.Year = year
            Return PartialView(db.IMatricula.GetGradosDisponibles(year))
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _new_PeriodoNuevoIngreso(year As Integer) As ActionResult
            ViewBag.Year = year
            Return PartialView()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _add_pni_gradosDisponible(year As Integer) As ActionResult
            ViewBag.Year = year
            Return PartialView()
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _get_jqGrid_PNI_Grados(request As JqGridRequest, year As Integer) As ActionResult
            Dim db As New SchoolClickDAL

            'Obtenemos los datos que van a ser devueltos
            Dim datos As IEnumerable(Of V_MAT_GRADOS_DISPONIBLES) = db.IMatricula.GetGradosDisponibles(year - 1).ToArray()
            Dim total = db.IMatricula.GetGradosDisponibles(year - 1).Count

            'Preparamos la respuesta que sera enviada al jqGrid
            Dim response As New JqGridResponse With {
                .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(Request.RecordsCount))),
                .PageIndex = Request.PageIndex,
                .TotalRecordsCount = total
            }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.MATRICULA_GRADOS_DISPO)(p.ID_GRADOS_DISPONIBLES,
                                                                New jqGrid.MATRICULA_GRADOS_DISPO With {
                                                                        .Nombre = p.TITULO
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <JFValidarModel()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _save_PeriodoNuevoIngreso(year As Integer, model As InfoPeriodoNuevoIngreso) As JsonResult
            Dim db As New SchoolClickDAL
            db.IMatricula.InsertInfoPeriodoNuevoIngreso(year, model)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage(String.Format("El nuevo periodo de matrícula para nuevo ingreso año {0} se ha creado correctamente.", year),
                                                                       titulo:="¡Se creó correctamente!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.NewDoc,
                                                                       tiempo:=7000)})
        End Function
#End Region

#Region "METODOS PARA ""VER, ANULAR O ELIMINAR UNA SOLICITUD DE NUEVO INGRESO"""
        <HttpGet()> _
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function ModSolicitud(id As String) As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _edit_SolicitudNuevoIngreso(year As Integer, NIE As String) As ActionResult
            Dim iNIE As UInt64,
                db As New SchoolClickDAL
            If Not UInt64.TryParse(NIE, iNIE) Then Throw New ArgumentException("El campo de NIE solo admite caracteres numéricos, por favor corrija este error y vuelva a intentarlo.")

            'Ahora buscamos en el sistema si existe la solicitud o no en el sistema
            If Not db.IMatricula.IsExistNIE(NIE) Then Throw New ObjectNotFoundException("No se ha encontrado ninguna solicitud de nuevo ingreso con ese número de NIE del alumno.")

            'Regresamo la vista parcial donde se podran editar los datos
            ViewBag.NIE = iNIE
            ViewBag.Year = year
            ViewBag.Grado = db.IMatricula.GetGradoAplica(NIE, year)
            Return PartialView(db.IMatricula.GetSolicitudNuevoIngreso(NIE.EncodeHTML, year))
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _upt_solicitud_preselect(year As Integer, NIE As String, Activar As Boolean) As JsonResult
            Dim db As New SchoolClickDAL
            db.IMatricula.UpdateSolicitudPreselect(year, NIE.EncodeHTML, Activar)
            If Activar Then
                Return Json(New With {.success = True,
                                      .notify = New JFNotifySystemMessage(String.Format("El alumno con número de NIE {0} se agregó correctamente del listado de alumnos pre-seleccionados para el examen de admisión año {1}.", NIE, year),
                                                                       titulo:="¡Se cambió correctamente!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.Update,
                                                                       tiempo:=10000)})
            Else
                Return Json(New With {.success = True,
                                      .notify = New JFNotifySystemMessage(String.Format("El alumno con número de NIE {0} ha sido eliminado del listado de alumnos pre-seleccionados para el examen de admisión año {1}.", NIE, year),
                                                                       titulo:="¡Se cambió correctamente!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.Update,
                                                                       tiempo:=10000)})
            End If
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _del_solicitud_ni(year As Integer, NIE As String) As JsonResult
            Dim db As New SchoolClickDAL
            db.IMatricula.DeleteSolicitud(year, NIE)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage(String.Format("La solicitud para matrícula de nuevo ingreso año {0} del alumno con número de NIE {1} ha sido eliminado del sistema satisfactoriamente.", year, NIE),
                                                                       titulo:="¡Se eliminó correctamente!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.Delete,
                                                                       tiempo:=10000)})
        End Function
#End Region

#Region "METODOS PARA ""LISTADO DE PRE-SELECCION"""
        <HttpGet()> _
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function Preseleccion() As ActionResult
            Return View()
        End Function
#End Region

#Region "METODOS PARA ""INGRESO DE NOTAS DEL EXAMEN DE ADMISIÓN"""
        <HttpGet()> _
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function NotasExaAdmision() As ActionResult
            Return View()
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_matricula_AlumnosPreselect(request As JqGridRequest, Grado As String) As JsonResult
            Dim db As New SchoolClickDAL

            'Obtenemos los datos que van a ser devueltos
            Dim datos As IEnumerable(Of V_MAT_NOTAS_ALUMNOS_PRESELECCIONADOS) = db.IMatricula.GetNotasPreseleccion(Grado) _
                                                                                .OrderBy(Function(p) p.NOMBRE_COMPLETO) _
                                                                                .Skip((request.PageIndex) * request.RecordsCount) _
                                                                                .Take(request.RecordsCount).ToArray()


            'Recuperamos el total de alumnos con ese grado
            Dim total = db.IMatricula.GetPreseleccion(Grado).Count

            'Preparamos la respuesta que sera enviada al jqGrid
            Dim response As New JqGridResponse With {
                .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                .PageIndex = request.PageIndex,
                .TotalRecordsCount = total
            }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.MATRICULA_NOTAS_PRESELECT)(p.ID_SOLICITUD,
                                                                New jqGrid.MATRICULA_NOTAS_PRESELECT With {
                                                                        .Nombre = p.NOMBRE_COMPLETO,
                                                                        .NIE = p.NIE,
                                                                        .Nota = p.NOTA
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Function _save_jqGrid_row_nota_preselec(id As String, nota As Decimal) As JsonResult
            Dim db As New SchoolClickDAL
            Try
                db.IMatricula.InsertNotaExamen(id, nota)
                Return Json(True)
            Catch ex As Exception
                ex.Data.Clear()
                Return Json(False)
            End Try
        End Function
#End Region

#Region "METODOS PARA ""RESUMEN DE NOTAS DEL EXA. DE ADMISIÓN"""
        <HttpGet()> _
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function ResumenNotas() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _get_ResumenGral_NuevoIngreso(year As Integer) As ActionResult
            Dim db As New SchoolClickDAL
            Return PartialView(db.IMatricula.GetResumenGralNuevoIngreso(year))
        End Function
#End Region
    End Class
End Namespace
